<?php
namespace libs\qoy\Filter;
use libs\qoy\Request;
use libs\qoy\Exception\ExceptionBadRequest;
/**
 * SimpleMD5 简单的MD5拦截器
 *
 * - 签名的方案如下：
 *
 * + 1、排除签名参数（默认是sign）
 * + 2、将剩下的全部参数，按参数名字进行字典排序
 * + 3、将排序好的参数，全部用字符串拼接起来
 * + 4、进行md5运算
 *
 * 注意：无任何参数时，不作验签
 * @param array $config 初始化配置
 * @param string $config["signName"] 验证参数名
 */

class SimpleMD5 implements IFilter {

    protected $signName;
    /**
     * 构造方法 
     * @param array $config 初始化配置
     * @param string $config["signName"] 验证参数名
     */
    
    public function __construct(array $config= array("signName"=>'sign')) {
        $this->signName = $config["signName"];
    }
    /**
     * @see IFilter->check
     * @throws ExceptionBadRequest
     */
   
    public function check() {
        
        $allParams = Request::getAll();
        if (empty($allParams)) {
            return;
        }
        $sign = isset($allParams[$this->signName]) ? $allParams[$this->signName] : '';
        unset($allParams[$this->signName]);
        $expectSign = $this->encryptAppKey($allParams);
        
        if ($expectSign != $sign) {       
            throw new ExceptionBadRequest(ExceptionBadRequest::FILTER,"签名错误");//签名错误
        }
    }
    protected function encryptAppKey($params) {
        ksort($params);
        $paramsStrExceptSign = '';
        foreach ($params as $val) {
            $paramsStrExceptSign .= $val;
        }
        return md5($paramsStrExceptSign);
    }
}
